package br.com.werp.regras.documento.controle;

import br.com.werp.regras.documento.integracao.DocumentoDAO;
import br.com.werp.regras.documento.integracao.FabricaDAO;
import br.com.werp.regras.documento.integracao.VencimentoDAO;
import br.com.werp.regras.geral.Algoritimo;
import br.com.werp.regras.geral.Auditoria;
import br.com.werp.regras.geral.FabricaSubSistema;
import br.com.werp.regras.geral.Sequenciador;
import br.com.werp.regras.geral.util.BeanUtil;
import br.com.werp.regras.geral.util.Dia;
import br.com.werp.regras.geral.util.Util;
import br.com.werp.regras.geral.vos.documento.DocumentoFinanceiroVO;
import br.com.werp.regras.geral.vos.documento.DocumentoVecimentoAgrupadoVO;
import br.com.werp.regras.geral.vos.documento.DocumentoVencimentoPesquisaVO;
import br.com.werp.regras.geral.vos.documento.DocumentoVencimentoVO;
import br.com.werp.regras.geral.vos.tabelas.Agrupamento_documento;
import br.com.werp.regras.geral.vos.tabelas.Documento;
import br.com.werp.regras.geral.vos.tabelas.Documento_vencimento;

import java.util.Iterator;
import java.util.List;


/**
 * @author Sobreira
 * Criado em 10/07/2006
 */
public class ControleVencimento {
    public void apagarVencimentos(int docIdBanco, Object key, List vencimentos,
        String usuario) throws Exception {
        Auditoria auditoria = FabricaSubSistema.getAuditoria();
        Algoritimo algoritimo = FabricaSubSistema.getAlgoritimo();
        VencimentoDAO vencimentoDAO = FabricaDAO.getVencimentoDAO();
        DocumentoDAO documentoDAO = FabricaDAO.getDocumentoDAO();
        DocumentoVecimentoAgrupadoVO documentoVecimentoAgrupadoVO =
            new DocumentoVecimentoAgrupadoVO();

        documentoVecimentoAgrupadoVO.setApdo_doc_agrupador(docIdBanco);

        List vencimentosBanco =
            vencimentoDAO.obterVencimentosAgrupados(key,
                documentoVecimentoAgrupadoVO);
        List remover =
            algoritimo.gerarListaRemoverIdsReais(vencimentos, vencimentosBanco);

        for (Iterator iter = remover.iterator(); iter.hasNext();) {
            Object object = iter.next();

            DocumentoVecimentoAgrupadoVO agrupadoVO =
                (DocumentoVecimentoAgrupadoVO) object;
            Documento_vencimento documento_vencimento =
                new Documento_vencimento();
            Agrupamento_documento agrupamento_documento =
                new Agrupamento_documento();
            Documento documento = new Documento();
            BeanUtil.copiarVO(agrupadoVO, documento_vencimento);
            BeanUtil.copiarVO(agrupadoVO, agrupamento_documento);
            BeanUtil.copiarVO(agrupadoVO, documento);
            documentoDAO.apagarAgrupamento(key, agrupamento_documento);
            vencimentoDAO.apagarDocumentoVencimento(key, documento_vencimento);
            documentoDAO.apagarDocumento(key, documento);
            auditoria.auditarRecurso(key, usuario, documento, Auditoria.EXCLUIR);
            auditoria.auditarRecurso(key, usuario, documento_vencimento,
                Auditoria.EXCLUIR);
            auditoria.auditarRecurso(key, usuario, agrupamento_documento,
                Auditoria.EXCLUIR);
        }
    }

    public void salvarVenciementos(Object key,
        DocumentoFinanceiroVO documentoFinanceiroVO, List vencimentos,
        String usuario) throws Exception {
        Auditoria auditoria = FabricaSubSistema.getAuditoria();
        Sequenciador sequenciador = FabricaSubSistema.getSequenciador();
        VencimentoDAO vencimentoDAO = FabricaDAO.getVencimentoDAO();
        DocumentoDAO documentoDAO = FabricaDAO.getDocumentoDAO();
        apagarVencimentos(documentoFinanceiroVO.getDocm_id(), key, vencimentos,
            usuario);

        for (Iterator iter = vencimentos.iterator(); iter.hasNext();) {
            DocumentoVencimentoVO vencimentoVO =
                (DocumentoVencimentoVO) iter.next();
            Documento documento = new Documento();
            Documento_vencimento documento_vencimento =
                new Documento_vencimento();
            BeanUtil.copiarVO(vencimentoVO, documento_vencimento);
            BeanUtil.copiarVO(vencimentoVO, documento);

            if (vencimentoVO.isIdVirtual() &&
                    (vencimentoVO.getDcve_valor() != 0)) {
                documento.setDocm_id(sequenciador.obterProximoId(
                        Sequenciador.DOCUMENTO));
                documentoDAO.inserirDocumento(key, documento);
                documento_vencimento.setDcve_id(documento.getDocm_id());
                vencimentoDAO.inserirDocumentoVencimento(key,
                    documento_vencimento);

                Agrupamento_documento agrupamento_documento =
                    new Agrupamento_documento();
                agrupamento_documento.setApdo_doc_agrupado(documento_vencimento.getDcve_id());
                agrupamento_documento.setApdo_doc_agrupador(documentoFinanceiroVO.getDocm_id());
                documentoDAO.inserirAgrupamento_documento(key,
                    agrupamento_documento);

                auditoria.auditarRecurso(key, usuario, documento,
                    Auditoria.INCLUIR);
                auditoria.auditarRecurso(key, usuario, documento_vencimento,
                    Auditoria.INCLUIR);
                auditoria.auditarRecurso(key, usuario, agrupamento_documento,
                    Auditoria.INCLUIR);
                BeanUtil.copiarVO(documento_vencimento, vencimentoVO);
                BeanUtil.copiarVO(documento, vencimentoVO);
            } else {
                documentoDAO.atualizaDocumento(key, documento);
                vencimentoDAO.atualizaVencimento(key, documento_vencimento);
                auditoria.auditarRecurso(key, usuario, documento,
                    Auditoria.ALTERAR);
                auditoria.auditarRecurso(key, usuario, documento_vencimento,
                    Auditoria.ALTERAR);
            }
        }
    }

    public List obterVencimentos(Object key, int documentAgrupador)
        throws Exception {
        VencimentoDAO vencimentoDAO = FabricaDAO.getVencimentoDAO();
        DocumentoVecimentoAgrupadoVO documentoVecimentoAgrupadoVO =
            new DocumentoVecimentoAgrupadoVO();
        documentoVecimentoAgrupadoVO.setApdo_doc_agrupador(documentAgrupador);

        return vencimentoDAO.obterVencimentosAgrupados(key,
            documentoVecimentoAgrupadoVO);
    }

    public List pesquisarVencimentosVO(String dtVencInicio, String dtVencFim,
        DocumentoVencimentoPesquisaVO documentoVencimentoPesquisaVO)
        throws Exception {
        VencimentoDAO vencimentoDAO = FabricaDAO.getVencimentoDAO();

        return vencimentoDAO.pesquisarVencimentosVO(dtVencInicio, dtVencFim,
            documentoVencimentoPesquisaVO);
    }

    public DocumentoVencimentoVO obterVencimentoAgrupador(int documentoAgrupado)
        throws Exception {
        VencimentoDAO vencimentoDAO = FabricaDAO.getVencimentoDAO();
        DocumentoVecimentoAgrupadoVO documentoVecimentoAgrupadoVO =
            new DocumentoVecimentoAgrupadoVO();
        documentoVecimentoAgrupadoVO.setApdo_doc_agrupado(documentoAgrupado);

        return (DocumentoVencimentoVO) Util.get0(vencimentoDAO.obterVencimentoAgrupador(
                null, documentoVecimentoAgrupadoVO));
    }

    public int obterNumeroParcelaVencimento(
        DocumentoFinanceiroVO financeiroVO, DocumentoVencimentoVO vencimentoVO)
        throws Exception {
        List venList = obterVencimentos(null, financeiroVO.getDocm_id());
        int cont = 0;

        for (Iterator iter = venList.iterator(); iter.hasNext();) {
            cont++;

            if (vencimentoVO.equals(iter.next())) {
                return cont;
            }
        }

        return 0;
    }
}
